﻿using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using Sinacor.Infra.Service.Validation;
using Sinacor.Infra.Service.Common;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;

namespace Sinacor.Servico.Bovespa.ManutencaoOrdens.BusinessLogic {
	public class Negocio : BaseBusinessLogic
    {

		#region Construtores 
        private ResourceAccess.Negocio _negocio;
        public Negocio()
            : base()
        {
            _negocio = new Sinacor.Servico.Bovespa.ManutencaoOrdens.ResourceAccess.Negocio();
        } 
		#endregion Construtores

        #region Constantes Erro
        private int ERRO_OBJETO_NULO = 109381;
        private int ERRO_ORDEM_INESISTENTE = 109547;
        #endregion

		/// <summary>
		/// Consulta negócios disponíveis que atendam a ordem informada
		/// </summary>
		/// <param name="entity"></param>
		public List<BusinessEntity.Negocio> ConsultarNegociosDisponiveis(BusinessEntity.ChaveOrdem entity){

			//Verificar o diagrama de atividade
			//Negocio.ConsultarNegociosDisponiveis()

            List<BusinessEntity.Negocio> retorno = null;


            if(entity == null)
                throw new BusinessException(ERRO_OBJETO_NULO);


            //Chamar o método BusinessLogic.ManutencaoOrdens.ObterOrdem(), passando a chave da ordem como parâmetro de entrada.
            BusinessEntity.Ordem ordem = null;
            BusinessLogic.ManutencaoOrdens manutencao = new ManutencaoOrdens();
            ordem = manutencao.ObterOrdem(entity);

            if (ordem == null)
                throw new BusinessException(ERRO_ORDEM_INESISTENTE);

            if (ordem.NumeroOrdemSubSequencia > 0)
            {
                //Chamar o método BusinessLogic.ManutencaoOrdens.ObterOrdem(), passando os seguintes dados para formar a chave da ordem:

                //ChaveOrdem.NumeroOrdem = ordem.NumeroOrdem
                //ChaveOrdem.NumeroOrdemSubSequencia = 0
                //ChaveOrdem.DataOrdem = ordem.DataOrdem

                BusinessEntity.Ordem ordemMae = null;
                BusinessEntity.ChaveOrdem param = new Sinacor.Servico.Bovespa.ManutencaoOrdens.BusinessEntity.ChaveOrdem();

                param.NumeroOrdem = ordem.NumeroOrdem;
                param.NumeroOrdemSubSequencia = 0;
                param.DataOrdem = ordem.DataOrdem;

                ordemMae = manutencao.ObterOrdem(param);

                if (ordemMae.CodigoISIN.Substring(6, 2) == "PP")
                {
                    if (ordemMae.CodigoCasamento.Substring(6, 2) == "PP")
                    {
                        retorno = _negocio.ConsultarNegociosDisponiveis(ordem, true);
                    }
                    else
                    {
                        retorno = _negocio.ConsultarNegociosDisponiveis(ordem, false);
                    }
                }
                else
                {
                    retorno = _negocio.ConsultarNegociosDisponiveis(ordem, false);
                }

            }
            else
            {                
                retorno = _negocio.ConsultarNegociosDisponiveis(ordem,false);
            }

			return retorno;
		}

		/// <summary>
		/// Consulta negócios executados para ordem informada
		/// </summary>
		/// <param name="entity"></param>
		public List<BusinessEntity.Negocio> ConsultarNegociosExecutados(BusinessEntity.ChaveOrdem entity){
            
            if (entity == null)
                throw new BusinessException(ERRO_OBJETO_NULO);

            //Chamar o método BusinessLogic.ManutencaoOrdens.ObterOrdem(), passando a chave da ordem como parâmetro de entrada.
            BusinessEntity.Ordem ordem = null;
            BusinessLogic.ManutencaoOrdens manutencao = new ManutencaoOrdens();
            ordem = manutencao.ObterOrdem(entity);

            if (ordem == null)
                throw new BusinessException(ERRO_ORDEM_INESISTENTE);

            //Chamar o método ResourceAccess.ManutencaoOrdens.ConsultarNegociosExecutados(), passando a ordem obtida na ação anterior (BusinessEntity.Ordem)
            return _negocio.ConsultarNegociosExecutados(ordem);
                        			
		}
	}
}